package co.com.tye.presentation.backingBeans;

import co.com.tye.exceptions.*;
import co.com.tye.modelo.*;
import co.com.tye.modelo.dto.UsuarioDTO;
import co.com.tye.presentation.businessDelegate.*;
import co.com.tye.utilities.*;

import org.primefaces.component.calendar.*;
import org.primefaces.component.commandbutton.CommandButton;
import org.primefaces.component.inputtext.InputText;

import org.primefaces.event.RowEditEvent;

import java.io.Serializable;

import java.sql.*;

import java.text.DateFormat;
import java.text.SimpleDateFormat;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Set;
import java.util.TimeZone;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;

/**
 * @author Zathura Code Generator http://code.google.com/p/zathura/
 *         www.zathuracode.org
 *
 */
@ManagedBean
@ViewScoped
public class UsuarioView implements Serializable {
	private static final long serialVersionUID = 1L;
	private InputText txtContra;

	private InputText txtIdestudiante_Estudiante;
	private InputText txtIdfacultad_Facultad;
	private InputText txtIdprograma_Programa;
	private InputText txtIduniversidad_Universidad;
	private InputText txtUsu;
	private Calendar txtFechaUltimoIngreso;
	private CommandButton btnSave;
	private CommandButton btnModify;
	private CommandButton btnDelete;
	private CommandButton btnClear;
	private List<UsuarioDTO> data;
	private UsuarioDTO selectedUsuario;
	private Usuario entity;
	private boolean showDialog;
	@ManagedProperty(value = "#{BusinessDelegatorView}")
	private IBusinessDelegatorView businessDelegatorView;

	public UsuarioView() {
		super();
	}

	public void rowEventListener(RowEditEvent e) {
		try {
			UsuarioDTO usuarioDTO = (UsuarioDTO) e.getObject();

			if (txtContra == null) {
				txtContra = new InputText();
			}

			txtContra.setValue(usuarioDTO.getContra());

			if (txtIdestudiante_Estudiante == null) {
				txtIdestudiante_Estudiante = new InputText();
			}

			txtIdestudiante_Estudiante.setValue(usuarioDTO
					.getIdestudiante_Estudiante());

			if (txtIdfacultad_Facultad == null) {
				txtIdfacultad_Facultad = new InputText();
			}

			txtIdfacultad_Facultad
					.setValue(usuarioDTO.getIdfacultad_Facultad());

			if (txtIdprograma_Programa == null) {
				txtIdprograma_Programa = new InputText();
			}

			txtIdprograma_Programa
					.setValue(usuarioDTO.getIdprograma_Programa());

			if (txtIduniversidad_Universidad == null) {
				txtIduniversidad_Universidad = new InputText();
			}

			txtIduniversidad_Universidad.setValue(usuarioDTO
					.getIduniversidad_Universidad());

			if (txtUsu == null) {
				txtUsu = new InputText();
			}

			txtUsu.setValue(usuarioDTO.getUsu());

			if (txtFechaUltimoIngreso == null) {
				txtFechaUltimoIngreso = new Calendar();
			}

			txtFechaUltimoIngreso.setValue(usuarioDTO.getFechaUltimoIngreso());

			String usu = FacesUtils.checkString(txtUsu);
			entity = businessDelegatorView.getUsuario(usu);

			action_modify();
		} catch (Exception ex) {
		}
	}

	public String action_new() {
		action_clear();
		selectedUsuario = null;
		setShowDialog(true);

		return "";
	}

	public String action_clear() {
		entity = null;
		selectedUsuario = null;

		if (txtContra != null) {
			txtContra.setValue(null);
			txtContra.setDisabled(true);
		}

		if (txtIdestudiante_Estudiante != null) {
			txtIdestudiante_Estudiante.setValue(null);
			txtIdestudiante_Estudiante.setDisabled(true);
		}

		if (txtIdfacultad_Facultad != null) {
			txtIdfacultad_Facultad.setValue(null);
			txtIdfacultad_Facultad.setDisabled(true);
		}

		if (txtIdprograma_Programa != null) {
			txtIdprograma_Programa.setValue(null);
			txtIdprograma_Programa.setDisabled(true);
		}

		if (txtIduniversidad_Universidad != null) {
			txtIduniversidad_Universidad.setValue(null);
			txtIduniversidad_Universidad.setDisabled(true);
		}

		if (txtFechaUltimoIngreso != null) {
			txtFechaUltimoIngreso.setValue(null);
			txtFechaUltimoIngreso.setDisabled(true);
		}

		if (txtUsu != null) {
			txtUsu.setValue(null);
			txtUsu.setDisabled(false);
		}

		if (btnSave != null) {
			btnSave.setDisabled(true);
		}

		if (btnDelete != null) {
			btnDelete.setDisabled(true);
		}

		return "";
	}

	public void listener_txtFechaUltimoIngreso() {
		Date inputDate = (Date) txtFechaUltimoIngreso.getValue();
		DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
		FacesContext.getCurrentInstance().addMessage(
				"",
				new FacesMessage("Selected Date "
						+ dateFormat.format(inputDate)));
	}

	public void listener_txtId() {
		try {
			String usu = FacesUtils.checkString(txtUsu);
			entity = (usu != null) ? businessDelegatorView.getUsuario(usu)
					: null;
		} catch (Exception e) {
			entity = null;
		}

		if (entity == null) {
			txtContra.setDisabled(false);

			txtIdestudiante_Estudiante.setDisabled(false);
			txtIdfacultad_Facultad.setDisabled(false);
			txtIdprograma_Programa.setDisabled(false);
			txtIduniversidad_Universidad.setDisabled(false);

			//txtFechaUltimoIngreso.setDisabled(false);
			txtUsu.setDisabled(false);
			btnSave.setDisabled(false);
		} else {
			txtContra.setValue(entity.getContra());
			txtContra.setDisabled(false);
			/*txtFechaUltimoIngreso.setValue(entity.getFechaUltimoIngreso());
			txtFechaUltimoIngreso.setDisabled(false);*/

			if (entity.getEstudiante() != null) {
				txtIdestudiante_Estudiante.setValue(entity.getEstudiante()
						.getIdestudiante());
				txtIdestudiante_Estudiante.setDisabled(false);
			}else{
				txtIdestudiante_Estudiante.setValue("");
				txtIdestudiante_Estudiante.setDisabled(false);
			}

			if (entity.getFacultad()!=null) {
				txtIdfacultad_Facultad.setValue(entity.getFacultad()
						.getIdfacultad());
				txtIdfacultad_Facultad.setDisabled(false);
			}else {
				txtIdfacultad_Facultad.setValue("");
				txtIdfacultad_Facultad.setDisabled(false);
			}
			
			if (entity.getPrograma()!=null) {
				txtIdprograma_Programa.setValue(entity.getPrograma().getIdprograma());
				txtIdprograma_Programa.setDisabled(false);
			}else {
				txtIdprograma_Programa.setValue("");
				txtIdfacultad_Facultad.setDisabled(true);
			}
			
			if (entity.getUniversidad()!=null) {
				txtIduniversidad_Universidad.setValue(entity.getUniversidad()
						.getIduniversidad());
				txtIduniversidad_Universidad.setDisabled(false);
			}else {
				txtIduniversidad_Universidad.setValue("");
				txtIduniversidad_Universidad.setDisabled(false);
			}
			
			txtUsu.setValue(entity.getUsu());
			txtUsu.setDisabled(true);
			btnSave.setDisabled(false);

			if (btnDelete != null) {
				btnDelete.setDisabled(false);
			}
		}
	}

	public String action_edit(ActionEvent evt) {
		selectedUsuario = (UsuarioDTO) (evt.getComponent().getAttributes()
				.get("selectedUsuario"));
		txtUsu.setValue(selectedUsuario.getUsu());
		txtUsu.setDisabled(true);
		txtContra.setValue(selectedUsuario.getContra());
		txtContra.setDisabled(false);
		
		//controlar excepcion nullpointer
		if (selectedUsuario.getIdestudiante_Estudiante()!=null) {
			txtIdestudiante_Estudiante.setValue(selectedUsuario
					.getIdestudiante_Estudiante());
			txtIdestudiante_Estudiante.setDisabled(false);
		}else{
			txtIdestudiante_Estudiante.setValue("");
			txtIdestudiante_Estudiante.setDisabled(false);
		}
		if (selectedUsuario.getIdfacultad_Facultad()!=null) {
			txtIdfacultad_Facultad.setValue(selectedUsuario
					.getIdfacultad_Facultad());
			txtIdfacultad_Facultad.setDisabled(false);
		}else{
			txtIdfacultad_Facultad.setValue("");
			txtIdfacultad_Facultad.setDisabled(false);
		}
		if(selectedUsuario.getIdprograma_Programa()!=null){
			txtIdprograma_Programa.setValue(selectedUsuario
					.getIdprograma_Programa());
			txtIdprograma_Programa.setDisabled(false);
		}else{
			txtIdprograma_Programa.setValue("");
			txtIdprograma_Programa.setDisabled(false);
		}
		
		if (selectedUsuario.getIduniversidad_Universidad()!=null) {
			txtIduniversidad_Universidad.setValue(selectedUsuario
					.getIduniversidad_Universidad());
			txtIduniversidad_Universidad.setDisabled(false);
		}else{
			txtIduniversidad_Universidad.setValue("");
			txtIduniversidad_Universidad.setDisabled(false);
		}
		
		btnSave.setDisabled(false);
		setShowDialog(true);

		return "";
	}

	public String action_save() {
		try {
			if ((selectedUsuario == null) && (entity == null)) {
				action_create();
			} else {
				action_modify();
			}

			data = null;
		} catch (Exception e) {
			FacesUtils.addErrorMessage(e.getMessage());
		}

		return "";
	}

	public String action_create() {
		try {
			entity = new Usuario();

			String usu = FacesUtils.checkString(txtUsu);

			entity.setContra(FacesUtils.checkString(txtContra));
			/*
			 * entity.setEstadoRegistro(FacesUtils.checkString(txtEstadoRegistro));
			 * entity.setFechaCreacion(FacesUtils.checkDate(txtFechaCreacion));
			 * entity.setFechaUltimaModificacion(FacesUtils.checkDate(txtFechaUltimaModificacion));
			 */
			/*entity.setFechaUltimoIngreso(FacesUtils
					.checkDate(txtFechaUltimoIngreso));*/
			entity.setUsu(usu);
			/*
			 * entity.setUsuarioCreador(FacesUtils.checkString(txtUsuarioCreador));
			 * entity.setUsuarioUltimaModificacion(FacesUtils.checkString(txtUsuarioUltimaModificacion));
			 */
			entity.setEstudiante((FacesUtils.checkInteger(txtIdestudiante_Estudiante) != null) ? businessDelegatorView.getEstudiante(FacesUtils.checkInteger(txtIdestudiante_Estudiante)) : null);
			entity.setFacultad((FacesUtils.checkInteger(txtIdfacultad_Facultad) != null) ? businessDelegatorView.getFacultad(FacesUtils.checkInteger(txtIdfacultad_Facultad)) : null);
			entity.setPrograma((FacesUtils.checkInteger(txtIdprograma_Programa) != null) ? businessDelegatorView.getPrograma(FacesUtils.checkInteger(txtIdprograma_Programa)) : null);
			entity.setUniversidad((FacesUtils.checkInteger(txtIduniversidad_Universidad) != null) ? businessDelegatorView.getUniversidad(FacesUtils.checkInteger(txtIduniversidad_Universidad)) : null);
			
			businessDelegatorView.saveUsuario(entity);
			FacesUtils.addInfoMessage(ZMessManager.ENTITY_SUCCESFULLYSAVED);
			action_clear();
		} catch (Exception e) {
			entity = null;
			FacesUtils.addErrorMessage(e.getMessage());
		}

		return "";
	}

	public String action_modify() {
		try {
			if (entity == null) {
				String usu = new String(selectedUsuario.getUsu());
				entity = businessDelegatorView.getUsuario(usu);
			}

			entity.setContra(FacesUtils.checkString(txtContra));
			/*
			 * entity.setEstadoRegistro(FacesUtils.checkString(txtEstadoRegistro)
			 * );
			 * entity.setFechaCreacion(FacesUtils.checkDate(txtFechaCreacion));
			 * entity.setFechaUltimaModificacion(FacesUtils.checkDate(
			 * txtFechaUltimaModificacion));
			 */
			/*entity.setFechaUltimoIngreso(FacesUtils
					.checkDate(txtFechaUltimoIngreso));*/
			/*
			 * entity.setUsuarioCreador(FacesUtils.checkString(txtUsuarioCreador)
			 * ); entity.setUsuarioUltimaModificacion(FacesUtils.checkString(
			 * txtUsuarioUltimaModificacion));
			 */
			entity.setEstudiante((FacesUtils
					.checkInteger(txtIdestudiante_Estudiante) != null) ? businessDelegatorView
					.getEstudiante(FacesUtils
							.checkInteger(txtIdestudiante_Estudiante)) : null);
			entity.setFacultad((FacesUtils.checkInteger(txtIdfacultad_Facultad) != null) ? businessDelegatorView
					.getFacultad(FacesUtils
							.checkInteger(txtIdfacultad_Facultad)) : null);
			entity.setPrograma((FacesUtils.checkInteger(txtIdprograma_Programa) != null) ? businessDelegatorView
					.getPrograma(FacesUtils
							.checkInteger(txtIdprograma_Programa)) : null);
			entity.setUniversidad((FacesUtils
					.checkInteger(txtIduniversidad_Universidad) != null) ? businessDelegatorView
					.getUniversidad(FacesUtils
							.checkInteger(txtIduniversidad_Universidad)) : null);
			
			businessDelegatorView.updateUsuario(entity);
			FacesUtils.addInfoMessage(ZMessManager.ENTITY_SUCCESFULLYMODIFIED);
		} catch (Exception e) {
			data = null;
			FacesUtils.addErrorMessage(e.getMessage());
		}

		return "";
	}

	public String action_delete_datatable(ActionEvent evt) {
		try {
			selectedUsuario = (UsuarioDTO) (evt.getComponent().getAttributes()
					.get("selectedUsuario"));

			String usu = new String(selectedUsuario.getUsu());
			entity = businessDelegatorView.getUsuario(usu);
			action_delete();
		} catch (Exception e) {
			FacesUtils.addErrorMessage(e.getMessage());
		}

		return "";
	}

	public String action_delete_master() {
		try {
			String usu = FacesUtils.checkString(txtUsu);
			entity = businessDelegatorView.getUsuario(usu);
			action_delete();
		} catch (Exception e) {
			FacesUtils.addErrorMessage(e.getMessage());
		}

		return "";
	}

	public void action_delete() throws Exception {
		try {
			businessDelegatorView.deleteUsuario(entity);
			FacesUtils.addInfoMessage(ZMessManager.ENTITY_SUCCESFULLYDELETED);
			action_clear();
			data = null;
		} catch (Exception e) {
			throw e;
		}
	}

	public String action_closeDialog() {
		setShowDialog(false);
		action_clear();

		return "";
	}

	public String actionDeleteDataTableEditable(ActionEvent evt) {
		try {
			selectedUsuario = (UsuarioDTO) (evt.getComponent().getAttributes()
					.get("selectedUsuario"));

			String usu = new String(selectedUsuario.getUsu());
			entity = businessDelegatorView.getUsuario(usu);
			businessDelegatorView.deleteUsuario(entity);
			data.remove(selectedUsuario);
			FacesUtils.addInfoMessage(ZMessManager.ENTITY_SUCCESFULLYDELETED);
			action_clear();
		} catch (Exception e) {
			FacesUtils.addErrorMessage(e.getMessage());
		}

		return "";
	}

	public String action_modifyWitDTO(String contra, String estadoRegistro,
			Date fechaCreacion, Date fechaUltimaModificacion,
			Date fechaUltimoIngreso, String usu, String usuarioCreador,
			String usuarioUltimaModificacion, Integer idestudiante_Estudiante,
			Integer idfacultad_Facultad, Integer idprograma_Programa,
			Integer iduniversidad_Universidad) throws Exception {
		try {
			entity.setContra(FacesUtils.checkString(contra));
			entity.setEstadoRegistro(FacesUtils.checkString(estadoRegistro));
			entity.setFechaCreacion(FacesUtils.checkDate(fechaCreacion));
			entity.setFechaUltimaModificacion(FacesUtils
					.checkDate(fechaUltimaModificacion));
			entity.setFechaUltimoIngreso(FacesUtils
					.checkDate(fechaUltimoIngreso));
			entity.setUsuarioCreador(FacesUtils.checkString(usuarioCreador));
			entity.setUsuarioUltimaModificacion(FacesUtils
					.checkString(usuarioUltimaModificacion));
			businessDelegatorView.updateUsuario(entity);
			FacesUtils.addInfoMessage(ZMessManager.ENTITY_SUCCESFULLYMODIFIED);
		} catch (Exception e) {
			// renderManager.getOnDemandRenderer("UsuarioView").requestRender();
			FacesUtils.addErrorMessage(e.getMessage());
			throw e;
		}

		return "";
	}

	public InputText getTxtContra() {
		return txtContra;
	}

	public void setTxtContra(InputText txtContra) {
		this.txtContra = txtContra;
	}

	public InputText getTxtIdestudiante_Estudiante() {
		return txtIdestudiante_Estudiante;
	}

	public void setTxtIdestudiante_Estudiante(
			InputText txtIdestudiante_Estudiante) {
		this.txtIdestudiante_Estudiante = txtIdestudiante_Estudiante;
	}

	public InputText getTxtIdfacultad_Facultad() {
		return txtIdfacultad_Facultad;
	}

	public void setTxtIdfacultad_Facultad(InputText txtIdfacultad_Facultad) {
		this.txtIdfacultad_Facultad = txtIdfacultad_Facultad;
	}

	public InputText getTxtIdprograma_Programa() {
		return txtIdprograma_Programa;
	}

	public void setTxtIdprograma_Programa(InputText txtIdprograma_Programa) {
		this.txtIdprograma_Programa = txtIdprograma_Programa;
	}

	public InputText getTxtIduniversidad_Universidad() {
		return txtIduniversidad_Universidad;
	}

	public void setTxtIduniversidad_Universidad(
			InputText txtIduniversidad_Universidad) {
		this.txtIduniversidad_Universidad = txtIduniversidad_Universidad;
	}

	public Calendar getTxtFechaUltimoIngreso() {
		return txtFechaUltimoIngreso;
	}

	public void setTxtFechaUltimoIngreso(Calendar txtFechaUltimoIngreso) {
		this.txtFechaUltimoIngreso = txtFechaUltimoIngreso;
	}

	public InputText getTxtUsu() {
		return txtUsu;
	}

	public void setTxtUsu(InputText txtUsu) {
		this.txtUsu = txtUsu;
	}

	public List<UsuarioDTO> getData() {
		try {
			if (data == null) {
				data = businessDelegatorView.getDataUsuario();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}

		return data;
	}

	public void setData(List<UsuarioDTO> usuarioDTO) {
		this.data = usuarioDTO;
	}

	public UsuarioDTO getSelectedUsuario() {
		return selectedUsuario;
	}

	public void setSelectedUsuario(UsuarioDTO usuario) {
		this.selectedUsuario = usuario;
	}

	public CommandButton getBtnSave() {
		return btnSave;
	}

	public void setBtnSave(CommandButton btnSave) {
		this.btnSave = btnSave;
	}

	public CommandButton getBtnModify() {
		return btnModify;
	}

	public void setBtnModify(CommandButton btnModify) {
		this.btnModify = btnModify;
	}

	public CommandButton getBtnDelete() {
		return btnDelete;
	}

	public void setBtnDelete(CommandButton btnDelete) {
		this.btnDelete = btnDelete;
	}

	public CommandButton getBtnClear() {
		return btnClear;
	}

	public void setBtnClear(CommandButton btnClear) {
		this.btnClear = btnClear;
	}

	public TimeZone getTimeZone() {
		return java.util.TimeZone.getDefault();
	}

	public IBusinessDelegatorView getBusinessDelegatorView() {
		return businessDelegatorView;
	}

	public void setBusinessDelegatorView(
			IBusinessDelegatorView businessDelegatorView) {
		this.businessDelegatorView = businessDelegatorView;
	}

	public boolean isShowDialog() {
		return showDialog;
	}

	public void setShowDialog(boolean showDialog) {
		this.showDialog = showDialog;
	}
}
